#pragma once
#include <iostream>
#include <typeinfo>
#include "Vector3D.h"

class Quaternion
{
private:
	//x,y,z imaginary components, w real component
	double x,y,z,w;
	void print(std::ostream& out) const;

public:
	Quaternion(void);
	Quaternion(double X,double Y,double Z,double W);
	Quaternion(const Quaternion& other);
	Quaternion(double in);
	Quaternion(Vector3D in);
	Quaternion& operator=(const Quaternion& other);
	Quaternion& operator+(const Quaternion& other);
	Quaternion& operator-(const Quaternion& other);
	Quaternion& operator*(const Quaternion& other);
	Quaternion& operator*=(double in);
	Quaternion& operator-(void);
	Quaternion& operator!();
	Quaternion& operator%(const Quaternion& other);
	friend std::ostream& operator<<(std::ostream& out, const Quaternion& q);
	~Quaternion(void);
};

